package com.tio.server.client;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;
import com.tio.server.tcp.common.TioPacket;
import org.tio.client.ClientChannelContext;
import org.tio.client.ReconnConf;
import org.tio.client.TioClient;
import org.tio.client.TioClientConfig;
import org.tio.client.intf.TioClientHandler;
import org.tio.client.intf.TioClientListener;
import org.tio.core.Node;
import org.tio.core.Tio;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @author tanyaowu
 */
public class TioClientClusterStarter {

    //handler, 包括编码、解码、消息处理
    public static TioClientHandler tioClientHandler = new TioClientAioHandler();
    //事件监听器，可以为null，但建议自己实现该接口，可以参考showcase了解些接口
    public static TioClientListener aioListener = null;
    //断链后自动连接的，不想自动连接请设为null
    private static ReconnConf reconnConf = new ReconnConf(5000L);
    //一组连接共用的上下文对象
    public static TioClientConfig clientTioConfig = new TioClientConfig(tioClientHandler, aioListener, reconnConf);
    public static TioClient tioClient = null;
    public static ClientChannelContext clientChannelContext = null;
    public static List<ClientChannelContext> clientChannelContexts = CollUtil.newArrayList();

    /**
     * 启动程序入口
     */
    public static void main(String[] args) throws Exception {

        //服务器节点
        Node serverNode = new Node("127.0.0.1", 8820);
        clientTioConfig.setHeartbeatTimeout(5000);
        tioClient = new TioClient(clientTioConfig);
        for (int i = 0; i < 10; i++) {
            clientChannelContext = tioClient.connect(serverNode);
            clientChannelContexts.add(clientChannelContext);
        }
        //连上后，发条消息玩玩
        //send();
        task();
    }

    private static void send() throws Exception {

        //随机取其中一个通道
        //clientChannelContext = RandomUtil.randomEle(clientChannelContexts);

        // 生成一个随机索引，范围是 0 到数组长度 - 1
        int randomIndex = ThreadLocalRandom.current().nextInt(clientChannelContexts.size());
        // 获取随机索引对应的元素
        clientChannelContext = clientChannelContexts.get(randomIndex);

        TioPacket packet = new TioPacket();
        packet.setBody(("hello world" + randomIndex).getBytes(TioPacket.CHARSET));
        Tio.send(clientChannelContext, packet);
    }

    private static void task() throws Exception {
        // 启动定时任务调度器
        CronUtil.start();
        // 添加一个定时任务，使用 cron 表达式 "0/5 * * * * ?" 表示每隔 5 秒执行一次
        CronUtil.schedule("0/5 * * * * ?", new Task() {
            @Override
            public void execute() {
                try {
                    send();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });
    }

}